// run: $exec < input
// opt: 0
// flag: -g
#include <iostream>
#include <queue>
#include <vector>
#include <string>
#include <algorithm>

int const alpha_size = 26;
int ord[alpha_size + 4][alpha_size + 4];

int n;
std::vector<std::string> name;

bool check(int x, int y)
{
	int l1 = name[x].size();
	int l2 = name[y].size();
	int l = std::min(l1, l2);
	int i = 0;
	for (; i < l; i++)
		if (name[x][i] != name[y][i]) break;
	if (i == l) return l1 <= l2;
	int c1 = name[x][i] - 'a', c2 = name[y][i] - 'a';
	if (ord[c1][c2] == 2) return false;
	ord[c1][c2] = 1;
	ord[c2][c1] = 2;
	return true;
}

int indegree[alpha_size + 4];

void output()
{
	for (int i = 0; i < alpha_size; i++)
		for (int j = i + 1; j < alpha_size; j++) {
			if (ord[i][j] == 1) indegree[j]++;
			else if (ord[i][j] == 2) indegree[i]++;
		}

	std::queue<int> q;
	for (int i = 0; i < alpha_size; i++)
		if (!indegree[i]) q.push(i);

	while (!q.empty()) {
		int now = q.front(); q.pop();
		std::cout << char('a' + now);
		for (int i = 0; i < alpha_size; i++)
			if (ord[now][i] == 1) {
				indegree[i]--;
				if (!indegree[i]) q.push(i);
			}
	}
	std::cout << '\n';
}

int vis[alpha_size + 4];

bool find_circle(int x)
{
	vis[x] = 1;
	for (int i = 0; i < alpha_size; i++)
		if (ord[x][i] == 1) {
			if (vis[i] == 1) return true;
			if (vis[i] == 2) continue;
			if (find_circle(i)) return true;
		}
	vis[x] = 2;
	return false;
}

int main()
{
	std::cin >> n;
	name.resize(n);
	for (int i = 0; i < n; i++) std::cin >> name[i];

	for (int i = 0; i < n; i++)
		for (int j = i + 1; j < n; j++) {
			if (!check(i, j)) {
				std::cout << "Impossible\n";
				return 0;
			}
		}

	for (int i = 0; i < alpha_size; i++)
		if (!vis[i] && find_circle(i)) {
			std::cout << "Impossible\n";
			return 0;
		}

	output();
}

